/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Ventas.DAO;

import com.dp1.pucp.Modelo.Clases.Documentoventa;
import com.dp1.pucp.Modelo.Clases.Kardex;
import com.dp1.pucp.Modelo.Clases.Lineapedidoproducto;
import com.dp1.pucp.Modelo.Clases.Moneda;
import com.dp1.pucp.Modelo.Clases.Pedidoproducto;
import com.dp1.pucp.Modelo.Clases.Productofinal;
import com.dp1.pucp.Modelo.Clases.Tipoproducto;
import com.dp1.pucp.Util.HibernateUtil;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author Lucia
 */
public class DocVentaDAO {

    public ArrayList<String> listarEstado() {
        ArrayList<String> estados = new ArrayList<>();
        estados.add("Activo");
        estados.add("Inactivo");
        return estados;
    }

    public ArrayList<String> listarEstadoDocVentas() {
        ArrayList<String> estados = new ArrayList<>();
        estados.add("-Seleccione-"); //0
        estados.add("Cancelada"); //1
        estados.add("Registrada"); //2
        estados.add("Pagada"); //3
        estados.add("Entregada"); //4
        return estados;
    }

    public ArrayList<Moneda> listarMonedas() {
        ArrayList<Moneda> listaMonedas = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista = session.createQuery("from Moneda where idmoneda = 1 order by idmoneda").list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Moneda m = (Moneda) iter.next();
                Hibernate.initialize(m.getIdmoneda());
                Hibernate.initialize(m.getNombre());
                listaMonedas.add(m);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return listaMonedas;
        }
    }

    public ArrayList<Pedidoproducto> listarPedidoProd(int codigo) {//SOlo tiene que listar a los que esten en estado Finalizado == 4
        ArrayList<Pedidoproducto> listaResultados = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista;

            if (codigo == 0) { //todos
                lista = session.createQuery("from Pedidoproducto where estado = 1 order by idpedidoproducto").list();                   //pedidoProducto estado 1= REGISTRADO
            } else { // por codigo
                lista = session.createQuery("from Pedidoproducto where  idpedidoproducto=" + codigo + " and estado = 4").list();
            }

            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Pedidoproducto c = (Pedidoproducto) iter.next();
                Hibernate.initialize(c.getIdpedidoproducto());
                Hibernate.initialize(c.getTotal());
                Hibernate.initialize(c.getCliente());
                Hibernate.initialize(c.getCliente().getIdcliente());
                Hibernate.initialize(c.getCliente().getRazonsocial());
                Hibernate.initialize(c.getFechaRegistro());
                Hibernate.initialize(c.getFechaEntrega());
                Hibernate.initialize(c.getLineapedidoproductos());



                listaResultados.add(c);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return listaResultados;
        }
    }

    public ArrayList<Pedidoproducto> listarPedidoProd() {//SOlo tiene que listar a los que esten en estado Finalizado == 4
        ArrayList<Pedidoproducto> listaResultados = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista;
            lista = session.createQuery("from Pedidoproducto order by idpedidoproducto").list();

            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Pedidoproducto c = (Pedidoproducto) iter.next();
                Hibernate.initialize(c.getIdpedidoproducto());
                Hibernate.initialize(c.getTotal());
                Hibernate.initialize(c.getCliente());
                Hibernate.initialize(c.getCliente().getIdcliente());
                Hibernate.initialize(c.getCliente().getRazonsocial());
                Hibernate.initialize(c.getFechaRegistro());
                Hibernate.initialize(c.getFechaEntrega());
                Hibernate.initialize(c.getLineapedidoproductos());
                listaResultados.add(c);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return listaResultados;
        }
    }

    public ArrayList<Lineapedidoproducto> listarLineasPedidosProd(Pedidoproducto p) {
        ArrayList<Lineapedidoproducto> listaResultados = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista = session.createQuery("from Lineapedidoproducto where idpedidoproducto=" + p.getIdpedidoproducto() + " order by idpedidoproducto").list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Lineapedidoproducto l = (Lineapedidoproducto) iter.next();
                Hibernate.initialize(l.getIdlineapedidoproducto());
                Hibernate.initialize(l.getTipoproducto());
                Hibernate.initialize(l.getTipoproducto().getIdtipoproducto());
                Hibernate.initialize(l.getCantidad());
                Hibernate.initialize(l.getPUnitario());
                Hibernate.initialize(l.getPresentacion());
                Hibernate.initialize(l.getPresentacion().getIdpresentacion());
                Hibernate.initialize(l.getPresentacion().getCantidad());
                Hibernate.initialize(l.getSubtotal());
                Hibernate.initialize(l.getPedidoproducto());
                Hibernate.initialize(l.getPedidoproducto().getIdpedidoproducto());

                listaResultados.add(l);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return listaResultados;
        }
    }

    public ArrayList<Documentoventa> listarDocVentas(int estado, int codigo) {

        ArrayList<Documentoventa> listaResultados = new ArrayList<>();

        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista;

            if (estado == 0) { //todos los estados
                if (codigo == 0) {//todos los codigos
                    lista = session.createQuery("from Documentoventa ").list();
                } else { //por codigo
                    lista = session.createQuery("from Documentoventa where iddocumentoventa=" + codigo).list();
                }
            } else { //por estado
                estado = estado - 1;
                if (codigo == 0) {//todos los codigo
                    lista = session.createQuery("from Documentoventa where estado=" + estado).list();
                } else { //por codigo
                    lista = session.createQuery("from Documentoventa where iddocumentoventa=" + codigo + " and estado= " + estado).list();
                }
            }


            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Documentoventa dv = (Documentoventa) iter.next();
                Hibernate.initialize(dv.getIddocumentoventa());
                Hibernate.initialize(dv.getCliente());
                Hibernate.initialize(dv.getCliente().getIdcliente());
                Hibernate.initialize(dv.getCliente().getRazonsocial());
                Hibernate.initialize(dv.getEstado());
                Hibernate.initialize(dv.getFechaemision());
                Hibernate.initialize(dv.getFechapago());
                Hibernate.initialize(dv.getPedidoproducto());
                Hibernate.initialize(dv.getPedidoproducto().getIdpedidoproducto());
                listaResultados.add(dv);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return listaResultados;
        }
    }

    public void guardarDocVenta(Documentoventa doc) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.saveOrUpdate(doc);
            session.persist(doc);
            session.flush();
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }

    public Pedidoproducto getPedidoProducto(int cod) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {

            Pedidoproducto c = new Pedidoproducto();
            List lista = session.createQuery("from Pedidoproducto where idpedidoproducto=" + cod).list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                c = (Pedidoproducto) iter.next();
            }
            tx.commit();

            return c;
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    public void guardarTipoProducto(Tipoproducto tipoproducto) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.saveOrUpdate(tipoproducto);
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }

    public Productofinal getProductoFinal(int cod) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {

            Productofinal c = new Productofinal();
            List lista = session.createQuery("from Productofinal where idtipoproducto=" + cod).list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                c = (Productofinal) iter.next();
                Hibernate.initialize(c.getIdproductofinal());
                Hibernate.initialize(c.getTipoproducto());
                Hibernate.initialize(c.getTipoproducto().getIdtipoproducto());
                Hibernate.initialize(c.getTipoproducto().getNombre());
                Hibernate.initialize(c.getAlmacen());
                Hibernate.initialize(c.getAlmacen().getIdalmacen());
                Hibernate.initialize(c.getCantidad());

            }
            tx.commit();

            return c;
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }

    }

    public Tipoproducto getTipoProducto(int cod) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {

            Tipoproducto c = new Tipoproducto();
            List lista = session.createQuery("from Tipoproducto where idtipoproducto=" + cod).list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                c = (Tipoproducto) iter.next();
                Hibernate.initialize(c.getIdtipoproducto());
                Hibernate.initialize(c.getNombre());
                Hibernate.initialize(c.getEstado());

            }
            tx.commit();

            return c;
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }

    public void guardarProductoFinal(Productofinal productoFinal) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.saveOrUpdate(productoFinal);
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }

    public void guardarKardex(Kardex kardex) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.saveOrUpdate(kardex);
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
        }
    }
}
